package com.puwang.openglbasic;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.Matrix;

/**
 * 显示3D场景的类
 */
public class MyTDView extends GLSurfaceView
{
	//每次三角形旋转的角度
	final float ANGLE_SPAN = 0.375f;
	//自定义线程类RotateThread的引用，
	RotateThread rthread;
	//自定义渲染器的引用
	SceneRenderer mRenderer;
	public MyTDView(Context context)
	{
		super(context);
		//使用OpnGL ES 2.0 	需设置该值为2
		this.setEGLContextClientVersion(2);
		mRenderer=new SceneRenderer();//创建SceneRenderer类的对象
		this.setRenderer(mRenderer);//设置渲染器
		//设置渲染器模式为主动渲染。调用渲染器，连续地重新渲染场景。
		this.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
	}

	//自定义渲染器
	private class SceneRenderer implements GLSurfaceView.Renderer
	{
		//声明Triangle
		Triangle tle;

		//重写onDrawFrame方法
		@Override
		public void onDrawFrame(GL10 gl)
		{
			//清除深度缓冲与颜色缓冲（首先要做的事情）
			GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
			//绘制三角形，通过Triangle的对象调用drawSelf绘制三角形
			tle.drawSelf();
		}

		//此方法中设置视窗、透视投影、摄像机位置
		public void onSurfaceChanged(GL10 gl, int width, int height)
		{
			//设置视窗大小及位置
			GLES20.glViewport(0, 0, width, height);
			//计算GLSurfaceView的宽高比
			float ratio = (float) width / height;
			//调用此方法计算产生透视投影矩阵
			Matrix.frustumM(Triangle.mProjMatrix, 0, -ratio, ratio, -1, 1, 1, 10);
			//调用此方法产生摄像机9参数位置矩阵
			Matrix.setLookAtM(Triangle.mVMatrix, 0, 0,0,3,0f,0f,0f,0f,1.0f,0.0f);
		}
		public void onSurfaceCreated(GL10 gl, EGLConfig config)
		{
			//设置屏幕背景色RGBA
			GLES20.glClearColor(0,0,0,1.0f);
			//创建三角形对对象
			tle=new Triangle(MyTDView.this);
			//打开深度检测
			GLES20.glEnable(GLES20.GL_DEPTH_TEST);
			//线程操作，简单的角度计算工作
			rthread=new RotateThread();
			rthread.start();
		}
	}

	public class RotateThread extends Thread
	{
		//设置循环标志位
		public boolean flag=true;
		@Override
		public void run()
		{
			while(flag)	//循环
			{
				mRenderer.tle.xAngle=mRenderer.tle.xAngle+ANGLE_SPAN;
				try
				{
					Thread.sleep(20);
				}
				catch(Exception e)
				{
					e.printStackTrace();
				}
			}
		}
	}
}